package com.linkgie.galaxyframework.persistence.data;

import com.linkgie.galaxyframework.utils.bean.FieldSelect;

/**
 * 分组聚合操作；
 */
public interface EntityGroupAggregation<T, R> {

    /**
     * 获取指定字段的最大值；
     * 
     * @param aggegatedFieldSelector 聚合函数字段选择器；
     * @return
     */
    EntityGroupFieldAggregation<T, R> max(FieldSelect<T> aggegatedFieldSelector);

    /**
     * 获取指定字段的最小值；
     * 
     * @param aggegatedFieldSelector 聚合函数字段选择器；
     * @return
     */
    EntityGroupFieldAggregation<T, R> min(FieldSelect<T> aggegatedFieldSelector);

    /**
     * 汇总指定字段的值；
     * 
     * @param aggegatedFieldSelector 聚合函数字段选择器；
     * @return
     */
    EntityGroupFieldAggregation<T, R> sum(FieldSelect<T> aggegatedFieldSelector);

    /**
     * 获取指定字段的平均值；
     * 
     * @param aggegatedFieldSelector 聚合函数字段选择器；
     * @return
     */
    EntityGroupFieldAggregation<T, R> avg(FieldSelect<T> aggegatedFieldSelector);

    /**
     * 获取指定字段的首条记录的值；
     * 
     * @param aggegatedFieldSelector 聚合函数字段选择器；
     * @return
     */
    EntityGroupFieldAggregation<T, R> first(FieldSelect<T> aggegatedFieldSelector);

    /**
     * 获取指定字段的最后一条记录的值；
     * 
     * @param aggegatedFieldSelector 聚合函数字段选择器；
     * @return
     */
    EntityGroupFieldAggregation<T, R> last(FieldSelect<T> aggegatedFieldSelector);

    /**
     * 分组；
     *
     * @param groupbyFieldSelector 分组字段选择器；
     * @return
     */
    EntityGrouper<T,R> and();
}
